package neublaController

import (
	"encoding/csv"
	"fmt"
	"mime/multipart"
	"os"
	"strconv"

	"github.com/tealeg/xlsx/v3"
)

// convertExcelToCSV 将Excel文件转换为CSV
func convertExcelToCSV(excelFile multipart.File, csvPath string) error {
	// 创建临时Excel文件
	tempExcelPath := csvPath + ".temp.xlsx"
	if err := saveUploadedFile(excelFile, tempExcelPath); err != nil {
		return fmt.Errorf("保存临时Excel文件失败: %w", err)
	}
	defer os.Remove(tempExcelPath)

	// 打开Excel文件
	xlsxFile, err := xlsx.OpenFile(tempExcelPath)
	if err != nil {
		return fmt.Errorf("打开Excel文件失败: %w", err)
	}

	// 创建CSV文件
	csvFile, err := os.Create(csvPath)
	if err != nil {
		return fmt.Errorf("创建CSV文件失败: %w", err)
	}
	defer csvFile.Close()

	writer := csv.NewWriter(csvFile)
	defer writer.Flush()

	// 转换第一个工作表
	if len(xlsxFile.Sheets) == 0 {
		return fmt.Errorf("Excel文件中没有工作表")
	}

	sheet := xlsxFile.Sheets[0]
	// 使用 ForEachRow 方法遍历行
	err = sheet.ForEachRow(func(row *xlsx.Row) error {
		var csvRow []string
		// 使用 ForEachCell 方法遍历单元格
		err := row.ForEachCell(func(cell *xlsx.Cell) error {
			value, err := cell.FormattedValue()
			if err != nil {
				// 如果格式化失败，尝试获取原始值
				if cell.Type() == xlsx.CellTypeNumeric {
					numValue, _ := cell.Float()
					value = strconv.FormatFloat(numValue, 'f', -1, 64)
				} else {
					value = cell.String()
				}
			}
			csvRow = append(csvRow, value)
			return nil
		})
		if err != nil {
			return err
		}

		if err := writer.Write(csvRow); err != nil {
			return fmt.Errorf("写入CSV行失败: %w", err)
		}
		return nil
	})

	if err != nil {
		return fmt.Errorf("遍历Excel行失败: %w", err)
	}

	return nil
}
